# 定义

代理模式(proxy),为其他对象提供一种代理以控制对象的访问

代理模式结构图

image-20200301234515923
  • Subject 类,定义了 RealSubject 和 Proxy的共同接口,这样就在任何使用 RealSubject的地方都可以使用 Proxy
  • RealSubject类,定义了 Proxy 所代表的真实实体。
  • Proxy 类,保存一个引用使得代理访问实体,并提供一个与 Subject 的接口相同的接口,这样代理就可以来替代实体。

# 应用

  • Java
    • 数据库连接池中,一般我们在调用数据库的关闭方法的时候,并不是直接关闭了数据库的连接,而是将数据库的连接放入到连接池中,以便下次使用
    • Aop 底层,便是使用代理设计模式,动态代理进行实现。实现前置通知,后置通知,环绕通知
  • JavaScript
    • Axios Http 请求中拦截器,可以提前对 request, response 进行预处理
      • Request 请求头的设置,与 Cookie 信息的设置
      • 权限信息的预处理,常见的比如验权操作或者 Token 验证
      • 数据格式的格式化,比如对组件绑定的 Date 类型的数据在请求前进行一些格式化约定好的序列化操作
      • 空字段格式预处理,根据后端进行一些操作
      • Response 的一些通用报错处理, 比如使用 Message 空间抛出错误
    • Vue 3.0 数据监听的处理使用 Proxy

# Java 实现代理模式

Subject.java

package com.xx.demo.agent;

/**
 * <p>
 * TODO:
 * </p>
 *
 * @author hcg
 * @date 2020/3/4 23:14
 * @className subject
 */
public interface Subject {
    void sayHello();
}

RealSubject.java 代理对象,也叫原对象

public class RealSubject implements Subject {
    @Override
    public void sayHello() {
        System.out.println("hello");
    }
}

ProxyFactory.java 代理工厂,创建代理类

public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("我要开始说话了");
                Object value = method.invoke(target, args);
                System.out.println("我已经说完了");
                return value;
            }
        });
    }

    public static void main(String[] args) {
        Subject subject = new RealSubject();
        ProxyFactory proxyFactory = new ProxyFactory(subject);
        Subject proxyInstance = (Subject) proxyFactory.getProxyInstance();
        proxyInstance.sayHello();
    }
}

# JavaScript 中的Proxy

# 代理模式和装饰器模式,适配器模式的区别

与适配器的区别

适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

与装饰器模式的区别

装饰器模式是为了增强功能,代理模式是为了加以控制。

最后编辑时间: 7/9/2020, 9:25:38 AM